package com.hb.unic.core.context;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.hb.unic.core.context.support.AbstractContext;
import org.springframework.context.ApplicationContext;

/**
 * 应用上下文
 *
 * @since v1.0，2023/8/28 20:51，create by Mr.Huang.
 */
public class UnicApplicationContext extends AbstractContext {

    /**
     * 上下文委托者
     */
    private static ApplicationContext delegator;

    /**
     * 构造方法
     */
    public UnicApplicationContext(ApplicationContext applicationContext) {
        if (delegator == null) {
            delegator = applicationContext;
        }
    }

    /**
     * 获取springContext
     *
     * @return 获取springContext
     */
    public ApplicationContext getSpringContext() {
        return delegator;
    }

    /**
     * 通过name获取Bean实例
     *
     * @param name Bean的名称
     * @return Bean实例
     */
    public <T> T getBean(String name, Class<T> beanClass) {
        return getSpringContext().getBean(name, beanClass);
    }

    /**
     * 通过class获取Bean实例
     *
     * @param clazz Bean的类型
     * @return Bean实例
     */
    public <T> T getBean(Class<T> clazz) {
        return getSpringContext().getBean(clazz);
    }

    /**
     * 通过class获取Bean实例集合
     *
     * @param clazz Bean的类型
     * @return Bean实例集合
     */
    public <T> Map<String, T> getBeanMap(Class<T> clazz) {
        return getSpringContext().getBeansOfType(clazz);
    }

    /**
     * 通过class获取Bean实例集合
     *
     * @param clazz Bean的类型
     * @return Bean实例集合
     */
    public <T> List<T> getBeanList(Class<T> clazz) {
        return new ArrayList<>(getBeanMap(clazz).values());
    }

}
